using Godot;

// 控制定期发送子弹
public partial class HitscanWeapon : Node3D
{
    // 枚举类型，表示快慢机射击模式
    public enum EnumTypeAutomatic
    {
        BoltAction = 0, // 手动
        SemiAuto = 1, // 半自动(单发)
        Burst2 = 2, // 2发点射
        Burst3 = 3, // 3发点射
        FullAuto = 5, // 全自动
        ReducedRate = 6, // 慢速射
        RapidFire = 7 // 快速射
    }

    [Export] public float ExFireRate = 14f; // 发射子弹的间隔时间

    [Export] public float ExRecoil = 0.05f; // 发射子弹后，枪的震动
    [Export] public float ExWeaponDamage = 15f; // 子弹伤害

    [Export] public Node3D ExWeaponMesh; // 枪支模型，用于修改坐标移动等属性，模拟后坐力等

    [Export(PropertyHint.Enum, "BOLT_ACTION:0,SEMI_AUTO:1,BURST_2:2,BURST_3:3,FULL_AUTO:5,REDUCED_RATE:6,RAPID_FIRE:7")]
    public EnumTypeAutomatic
        ExTypeAutomatic = EnumTypeAutomatic.FullAuto; // 快慢机射击模式，非自动（手动）0、半自动（单发） 1、2发点射 2、3发点射 3、全自动 5、慢速射 6、快速射 7

    [Export] public GpuParticles3D ExMuzzleFlash; // 枪口火焰粒子特效
    [Export] public PackedScene ExSparks; // 子弹击中目标时溅射粒子特效
    [Export] public RoboRampage.Player.AmmonHandler ExAmmonHandler; // 子弹管理器
    [Export] public RoboRampage.Player.AmmonHandler.EnumTypeAmmo ExEnumTypeAmmo; // 子弹类型

    private static Timer _cooldownTimer;
    private static Vector3 _weaponPosition = Vector3.Zero;
    private static RayCast3D _rayCast3D;

    public override void _Ready()
    {
        // 获取冷却计时器
        _cooldownTimer = (Timer)GetNode("CooldownTimer");
        _rayCast3D = (RayCast3D)GetNode("RayCast3D");
        // 获取枪支位置
        _weaponPosition = ExWeaponMesh.Position;
    }

    public override void _Process(double delta)
    {
        // 如果全自动
        if (ExTypeAutomatic != EnumTypeAutomatic.BoltAction &&
            ExTypeAutomatic != EnumTypeAutomatic.SemiAuto)
        {
            // 如果按下射击键
            if (Input.IsActionPressed("fire"))
            {
                // 如果冷却计时器停止
                if (_cooldownTimer.IsStopped())
                {
                    // 射击
                    Shoot();
                }
            }
        }
        else
        {
            // 如果按下射击键
            if (Input.IsActionJustPressed("fire"))
            {
                // 如果冷却计时器停止
                if (_cooldownTimer.IsStopped())
                {
                    // 射击
                    Shoot();
                }
            }
        }


        // 实现枪位置回弹恢复
        ExWeaponMesh.SetPosition(ExWeaponMesh.Position.Lerp(_weaponPosition, (float)delta * 10.0f));
    }

    public void Shoot()
    {
        // 检查是否有弹药
        if (!ExAmmonHandler.HasAmmo(ExEnumTypeAmmo)) return;
        // 使用弹药
        ExAmmonHandler.UseAmmo(ExEnumTypeAmmo);
        //粒子特效激活
        ExMuzzleFlash.Restart();
        // 开始冷却计时器，冷却时间为1 / ExFireRate
        _cooldownTimer.Start(1 / ExFireRate);
        // 打印武器发射
        // GD.Print("武器发射");
        // 如果ExWeaponMesh不为空
        if (ExWeaponMesh != null)
        {
            // 设置ExWeaponMesh的位置，Z轴增加ExRecoil,枪支后坐力实现
            // ExWeaponMesh.SetPosition(new Vector3(ExWeaponMesh.Position.X, ExWeaponMesh.Position.Y,
            //     ExWeaponMesh.Position.Z + ExRecoil));
            ExWeaponMesh.SetPosition(ExWeaponMesh.Position with { Z = ExWeaponMesh.Position.Z + ExRecoil });
            var collider = _rayCast3D.GetCollider();
            // GD.Print(collider);

            if (collider is Enemy enemy)
            {
                enemy.CurrHitpoints -= ExWeaponDamage;
            }

            var spark = (GpuParticles3D)ExSparks.Instantiate();
            AddChild(spark);
            // 打中粒子特效坐标等于射线和其他碰撞体的碰撞点的坐标
            spark.GlobalPosition = _rayCast3D.GetCollisionPoint();
        }
    }
}